home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / components / flockBlogsomeService.js < prev    next >
Text File  |  2007-10-18  |  22KB  |  643 lines

  1. // BEGIN FLOCK GPL
  2. // 
  3. // Copyright Flock Inc. 2005-2007
  4. // http://flock.com
  5. // 
  6. // This file may be used under the terms of of the
  7. // GNU General Public License Version 2 or later (the "GPL"),
  8. // http://www.gnu.org/licenses/gpl.html
  9. // 
  10. // Software distributed under the License is distributed on an "AS IS" basis,
  11. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12. // for the specific language governing rights and limitations under the
  13. // License.
  14. // 
  15. // END FLOCK GPL
  16.  
  17. const ENABLE_DEBUG = true; // switch to turn off slow debug code for production
  18. function DEBUG(x) { if (ENABLE_DEBUG) debug("flockBlogsomeService: "+x+"\n"); }
  19.  
  20. const Cc = Components.classes;
  21. const Ci = Components.interfaces;
  22.  
  23. const BLOGSOME_CID = Components.ID('{c36e232f-9a3e-4848-b9a8-d7a880a7544f}');
  24. const BLOGSOME_CONTRACTID = '@flock.com/service/blogsome;1';
  25.  
  26. const BLOGSOME_FAVICON = 'http://www.blogsome.com/favicon.ico';
  27. const SERVICE_ENABLED_PREF          = "flock.service.blogsome.enabled";
  28. const CATEGORY_COMPONENT_NAME       = "Blogsome JS Component"
  29. const CATEGORY_ENTRY_NAME           = "blogsome"
  30.  
  31. const RDFS = Cc['@mozilla.org/rdf/rdf-service;1'].getService (Ci.nsIRDFService);
  32.  
  33. var gCompTK;
  34. function getCompTK() {
  35.   if (!gCompTK) {
  36.     gCompTK = Components.classes["@flock.com/singleton;1"]
  37.                         .getService(Components.interfaces.flockISingleton)
  38.                         .getSingleton("chrome://browser/content/flock/services/common/load-compTK.js")
  39.                         .wrappedJSObject;
  40.   }
  41.   return gCompTK;
  42. }
  43.  
  44. function loadSubScript(spec) {
  45.   var loader = Cc['@mozilla.org/moz/jssubscript-loader;1'].getService(Ci.mozIJSSubScriptLoader);
  46.   var context = {};
  47.   loader.loadSubScript(spec, context);
  48.   return context;
  49. }
  50.  
  51. var loader = Cc['@mozilla.org/moz/jssubscript-loader;1'].getService(Ci.mozIJSSubScriptLoader);
  52.  
  53. loader.loadSubScript('chrome://browser/content/utilityOverlay.js');
  54. loader.loadSubScript("chrome://flock/content/xmlrpc/xmlrpchelper.js");
  55. loader.loadSubScript("chrome://flock/content/blog/blogBackendLib.js");
  56.  
  57.  
  58. function userBlogsListener(aListener){
  59.   this.listener = aListener;
  60. }
  61.  
  62. userBlogsListener.prototype =
  63. {
  64.   // aResult is an Array (simpleEnumerator) of struct objects
  65.   onResult: function(aResult) {
  66.     var result = new Array();
  67.     for (i=0; i<aResult.length; i++){
  68.       var entry = aResult[i];
  69.       var newAccount = new BlogAccount(entry.blogName);
  70.       newAccount.blogid = entry.blogid;
  71.       newAccount.apiLink = "";
  72.       newAccount.URL = entry.url;
  73.       result.push(newAccount);
  74.     }
  75.     this.listener.onResult(new simpleEnumerator(result));
  76.   },
  77.   onError: function(errorcode, errormsg) {
  78.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  79.     error.serviceErrorCode = errorcode;
  80.     error.serviceErrorString = errormsg;
  81.     // Stupid server doesn't return any correct XML, but just a plain text error message
  82.     if (errorcode.match("blog doesn't exist")) {
  83.       error.serviceErrorString = errorcode;
  84.       error.errorCode = Ci.flockIError.BLOG_INVALID_AUTH;
  85.     }
  86.     else
  87.       error.errorCode = Ci.flockIError.BLOG_UNKNOWN;
  88.     this.listener.onError(error);
  89.   },
  90.   onFault: function(errorcode, errormsg) {
  91.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  92.     error.serviceErrorCode = errorcode;
  93.     error.serviceErrorString = errormsg;
  94.     switch (errorcode) {
  95.       case 403: // Invalid login/pass
  96.         error.errorCode = Ci.flockIError.BLOG_INVALID_AUTH;
  97.         break;
  98.       default: // Unknown error code
  99.         error.errorCode = Ci.flockIError.BLOG_UNKNOWN;
  100.     }
  101.     this.listener.onFault(error);
  102.   }
  103. }
  104.  
  105.  
  106. function flockBSService () {
  107.   var obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  108.   obs.addObserver(this, 'xpcom-shutdown', false);
  109.   this.status = Ci.flockIWebService.STATUS_UNKNOWN;
  110.   this.initialized = false;
  111.  
  112.   this._ctk = {
  113.     interfaces: [
  114.       "nsISupports",
  115.       "nsIClassInfo",
  116.       "nsIObserver",
  117.       "nsISupportsCString",
  118.       "flockIWebService",
  119.       "flockIAuthenticateNewAccount",
  120.       "flockIManageableWebService",
  121.       "flockIBlogWebService"
  122.     ],
  123.     shortName: "blogsome",
  124.     fullName: "Blogsome",
  125.     description: "Blogsome Web Service",
  126.     favicon: BLOGSOME_FAVICON,
  127.     CID: BLOGSOME_CID,
  128.     contractID: BLOGSOME_CONTRACTID,
  129.     accountClass: flockBSAccount
  130.   };
  131.   this._profiler = Cc["@flock.com/profiler;1"].getService(Ci.flockIProfiler);
  132.  
  133.   this.init();
  134. }
  135.  
  136. // nsIObserver
  137. flockBSService.prototype.observe = function flockBSService_observe(subject, topic, state) {
  138.   switch (topic) {
  139.     case 'xpcom-shutdown':
  140.       var obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  141.       obs.removeObserver(this, 'xpcom-shutdown');
  142.       return;
  143.   }
  144. }
  145.  
  146. // flockIWebService implementation
  147. flockBSService.prototype.addAccount =
  148. function flockBSService_addAccount(aUsername, aPassword, aListener)
  149. {
  150.   //DEBUG("{flockIWebService}.addAccount('"+aUsername+"', 'XXXXXXXX', ...)");
  151.   //DEBUG(" THIS FUNCTION IS DEPRECATED AND SHOULD BE REPLACED WITH A CALL TO addAccountById() !");
  152.   return this.addAccountById(aUsername, true, aListener);
  153. }
  154.  
  155. flockBSService.prototype.addAccountById =
  156. function flockBSService_addAccountById(aUsername, aIsTransient, aListener)
  157. {
  158.   var accountURN = this.urn+":"+aUsername;
  159.   var account = new this.faves_coop.Account(accountURN, {
  160.     name: aUsername,
  161.     serviceId: BLOGSOME_CONTRACTID,
  162.     service: this.bsService,
  163.     accountId: aUsername,
  164.     isPollable : false,
  165.     isTransient: aIsTransient,
  166.     favicon: this.icon,
  167.     URL: this.url,
  168.     showInSidebar: false
  169.   });
  170.   this.faves_coop.accounts_root.children.addOnce(account);
  171.   // this.USER = blAccount.id();
  172.   // var acct = this.getAccount(blAccount.id());
  173.   this.USER = accountURN;
  174.  
  175.   // Add the blog account
  176.   var wpsvc = this;
  177.   var listener = {
  178.     onResult: function(aResult) {
  179.       var theBlog;
  180.       while (aResult.hasMoreElements()) {
  181.         theBlog = aResult.getNext();
  182.         theBlog.QueryInterface(Ci.flockIBlogAccount);
  183.         theCoopBlog = new wpsvc.faves_coop.Blog(accountURN+":"+theBlog.blogid, {
  184.           name: theBlog.title,
  185.           title: theBlog.title,
  186.           blogid: theBlog.blogid,
  187.           URL: theBlog.URL,
  188.           apiLink: theBlog.URL+'xmlrpc.php'
  189.         });
  190.         account.children.addOnce(theCoopBlog);
  191.  
  192.         // Comments: create the "My Blogs" folder if needed
  193.         var feedManager = Components.classes["@flock.com/feed-manager;1"].getService(Components.interfaces.flockIFeedManager);
  194.         var blogFolder = null;
  195.         var _enum = feedManager.getFeedContext("news").getRoot().getChildren();
  196.         while (_enum.hasMoreElements() && !blogFolder) {
  197.           var candidate = _enum.getNext();
  198.           if (candidate.getTitle() == "My Blogs")
  199.             blogFolder = candidate;
  200.         }
  201.         if (!blogFolder)
  202.           blogFolder = feedManager.getFeedContext("news").getRoot().addFolder("My Blogs");
  203.         // Comments: add the stream
  204.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  205.         var uri = ios.newURI(theBlog.URL+"comments/feed/", null, null);
  206.         var feedManagerListener = {
  207.           onGetFeedComplete: function(feed) {
  208.             blogFolder.subscribeFeed(feed);
  209.             Cc["@flock.com/metrics-service;1"]
  210.             .getService(Ci.flockIMetricsService)
  211.             .report("FeedsSidebar-AddFeed",  "BlogsomeNewAccount");
  212.           },
  213.           onError: function(error) {
  214.           }
  215.         }
  216.         feedManager.getFeed(uri, feedManagerListener);
  217.       }
  218.       if (aListener) aListener.onSuccess(acct, "addAccount");
  219.     },
  220.     onFault: function(aError) {
  221.       debug("flockBlogsomeService: fault in addAccount: "+aError);
  222.       wpsvc.faves_coop.accounts_root.children.remove(account);
  223.       account.destroy();
  224.       if(aListener) {
  225.         aListener.onError(null, 'FAULT', aError);
  226.       }
  227.     },
  228.     onError: function(aError) {
  229.       debug("flockBlogsomeService: error in addAccount: "+aError);
  230.       wpsvc.faves_coop.accounts_root.children.remove(account);
  231.       account.destroy();
  232.       if(aListener) {
  233.         aListener.onError(null, 'ERROR', aError);
  234.       }
  235.     }
  236.   };
  237.  
  238.   var apiLink = 'http://'+aUsername+'.blogsome.com/xmlrpc.php';
  239.   this.getUsersBlogs(listener, apiLink);
  240.  
  241.   var acct = this.getAccount(accountURN);
  242.   return acct;
  243. }
  244.  
  245.  
  246. flockBSService.prototype.removeAccount =
  247. function(aUrn)
  248. {
  249.   this.acUtils.removeAccount(aUrn);
  250. }
  251.  
  252.  
  253. flockBSService.prototype.getAccount =
  254. function(aUrn)
  255. {
  256.   this.logger.info("{flockIWebService}.getAccount('"+aUrn+"')");
  257.   var acctCoop = this.faves_coop.get(aUrn);
  258.   var acct = new flockBSAccount();
  259.   acct.urn = aUrn;
  260.   acct.username = acctCoop.username;
  261.   return acct;
  262. }
  263.  
  264.  
  265. flockBSService.prototype.init =
  266. function ()
  267. {
  268.   DEBUG(".init()");
  269.  
  270.   if (this.initialized) return;
  271.   this.initialized = true;
  272.  
  273.   var evtID = this._profiler.profileEventStart("blogsome-init");
  274.  
  275.   this.prefService = Components.classes["@mozilla.org/preferences-service;1"]
  276.                                .getService(Components.interfaces.nsIPrefBranch);
  277.   if ( this.prefService.getPrefType(SERVICE_ENABLED_PREF) &&
  278.        !this.prefService.getBoolPref(SERVICE_ENABLED_PREF) )
  279.   {
  280.     DEBUG("Pref "+SERVICE_ENABLED_PREF+" set to FALSE... not initializing.");
  281.     var catMgr = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
  282.     catMgr.deleteCategoryEntry("wsm-startup", CATEGORY_COMPONENT_NAME, true);
  283.     catMgr.deleteCategoryEntry("flockWebService", CATEGORY_ENTRY_NAME, true);
  284.     return;
  285.   }
  286.  
  287.   // Logger
  288.   this.logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
  289.   this.logger.init("blogsome");
  290.  
  291.   // Attributes of flockIBlogWebService
  292.   this.supportsCategories = 2;
  293.   this.supportsPostReplace = true;
  294.   this.metadataOverlay = "";
  295.  
  296.   this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  297.  
  298.   this.faves_coop = Cc["@flock.com/singleton;1"]
  299.                     .getService(Ci.flockISingleton)
  300.                     .getSingleton("chrome://flock/content/common/load-faves-coop.js")
  301.                     .wrappedJSObject;
  302.     this.account_root = this.faves_coop.accounts_root;
  303.  
  304.     this.bsService = new this.faves_coop.Service('urn:blogsome:service');
  305.   this.bsService.name = 'blogsome';
  306.   this.bsService.desc = 'The Blogsome.com Service';
  307.   this.bsService.logoutOption = false;
  308.   this.bsService.domains = "blogsome.com";
  309.   this.bsService.serviceId = BLOGSOME_CONTRACTID;
  310.  
  311.   this.urn = this.bsService.id();
  312.   this.url = "http://www.blogsome.com";
  313.  
  314.   this.webDetective = this.acUtils.useWebDetective("blogsome.xml");
  315.  
  316.   this._profiler.profileEventEnd(evtID, "");
  317. }
  318.  
  319.  
  320. flockBSService.prototype.refresh =
  321. function flockBSService_refresh(aURN, aListener)
  322. {
  323.     debug ("flockBSService refresh with aURN of " + aURN + "\n");
  324.  
  325.     // Introspection against what we're syncing - Identity or Account or Item?
  326.     var refreshItem = this.faves_coop.get(aURN);
  327.  
  328.   if (refreshItem instanceof this.faves_coop.Account) {
  329.     }
  330.   else if (refreshItem instanceof this.faves_coop.Favorite) {
  331.     }
  332.   else {
  333.         throw Components.results.NS_ERROR_ABORT;
  334.     }
  335. }
  336.  
  337. flockBSService.prototype.refreshAccount =
  338. function flockBSService_refreshAccount (aURN, aListener) {
  339.   debug("WPService - refreshAccount with aURN of " + aURN);
  340. }
  341.  
  342.  
  343. // BEGIN flockIBlogWebService interface
  344.  
  345.  
  346. flockBSService.prototype.newPost =
  347. function(aListener, aBlogId, aPost, aPublish, aNotifications)
  348. {
  349.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  350.   mtService.newPost(aListener, aBlogId, aPost, aPublish, aNotifications);
  351. }
  352.  
  353. flockBSService.prototype.editPost =
  354. function(aListener, aBlogId, aPost, aPublish, aNotifications)
  355. {
  356.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  357.   mtService.editPost(aListener, aBlogId, aPost, aPublish, aNotifications);
  358. }
  359.  
  360. flockBSService.prototype.deletePost =
  361. function(aListener, aBlogId, aPostid)
  362. {
  363.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  364.   mtService.deletePost(aListener, aBlogId, aPostid);
  365. }
  366.  
  367. flockBSService.prototype.getUsersBlogs =
  368. function(aListener, aUrl)
  369. {
  370.   var username = this.faves_coop.get(this.USER).name;
  371.   debug("USER: "+username+"\n");
  372.   var pw = this.acUtils.getPassword(this.urn+':'+username);
  373.   debug(" ^^^^^^^^^ Get the password for "+this.urn+':'+username+"\n");
  374.  
  375.   var listener = new userBlogsListener(aListener, false);
  376.   var xmlrpcServer = new flockXmlRpcServer (aUrl);
  377.   var args = ["flockbrowser", username, pw.password];
  378.   xmlrpcServer.call("blogger.getUsersBlogs", args, listener);
  379. }
  380.  
  381. flockBSService.prototype.getRecentPosts =
  382. function(aListener, aBlogId, aNumber)
  383. {
  384.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  385.   mtService.getRecentPosts(aListener, aBlogId, aNumber);
  386. }
  387.  
  388. flockBSService.prototype.getCategoryList =
  389. function(aListener, aBlogId)
  390. {
  391.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  392.   mtService.getCategoryList(aListener, aBlogId);
  393. }
  394.  
  395. // END flockIBlogWebService interface
  396.  
  397. // BEGIN flockIManageableWebService interface
  398. flockBSService.prototype.docRepresentsSuccessfulLogin =
  399. function flockBSService_docRepresentsSuccessfulLogin(aDocument)
  400. {
  401.   this.logger.debug("{flockIManageableWebService}.docRepresentsSuccessfulLogin(aDocument)");
  402.   aDocument.QueryInterface(Components.interfaces.nsIDOMHTMLDocument);
  403.   return this.webDetective.detect("blogsome", "loggedin", aDocument, null);
  404. }
  405.  
  406. flockBSService.prototype.getAccountIDFromDocument =
  407. function flockBSService_getAccountIDFromDocument(aDocument)
  408. {
  409.   this.logger.debug("{flockIManageableWebService}.getAccountIDFromDocument(aDocument)");
  410.   aDocument.QueryInterface(Components.interfaces.nsIDOMHTMLDocument);
  411.  
  412.   // The URL is the form http://<username>.blogsome.com
  413.   var ios = Components.classes["@mozilla.org/network/io-service;1"]
  414.                       .getService(Components.interfaces.nsIIOService);
  415.   var uri = ios.newURI(aDocument.URL, null, null);
  416.   return uri.host.split(".")[0];
  417. }
  418.  
  419. flockBSService.prototype.ownsDocument =
  420. function flockBSService_ownsDocument(aDocument)
  421. {
  422.   this.logger.debug("{flockIManageableWebService}.ownsDocument(aDocument)");
  423.   aDocument.QueryInterface(Components.interfaces.nsIDOMHTMLDocument);
  424.   var ios = Components.classes["@mozilla.org/network/io-service;1"]
  425.                       .getService(Components.interfaces.nsIIOService);
  426.   var uri = ios.newURI(aDocument.URL, null, null);
  427.   if ((uri.host == "blogsome.com") || (uri.host.indexOf(".blogsome.com") > 0)) {
  428.     return true;
  429.   }
  430.   else {
  431.     return false;
  432.   }
  433. }
  434.  
  435. flockBSService.prototype.updateAccountStatusFromDocument =
  436. function flockBSService_updateAccountStatusFromDocument(aDocument)
  437. {
  438.   this.logger.debug("{flockIManageableWebService}.updateAccountStatusFromDocument(aDocument)");
  439.   if (this.ownsDocument(aDocument)) {
  440.     if (this.docRepresentsSuccessfulLogin(aDocument)) {
  441.       var accountID = this.getAccountIDFromDocument(aDocument);
  442.       var acctURN = this.acUtils.getAccountURNById(this.urn, accountID);
  443.       var accounts = this.faves_coop.Account.find({serviceId: BLOGSOME_CONTRACTID});
  444.       for (var i = 0; i < accounts.length; i++) {
  445.         if (accounts[i].id() == acctURN) {
  446.           accounts[i].isAuthenticated = true;
  447.         } else {
  448.           accounts[i].isAuthenticated = false;
  449.         }
  450.       }
  451.     } else {
  452.       var login = aDocument.getElementById("Login");
  453.       if (login) {
  454.         this.acUtils.markAllAccountsAsLoggedOut(BLOGSOME_CONTRACTID);
  455.       }
  456.     }
  457.   }
  458. }
  459.  
  460. flockBSService.prototype.logout =
  461. function flockBSService_logout()
  462. {
  463.   this.logger.debug("{flockIManageableWebService}.logout()");
  464.   var cookieManager = Cc["@mozilla.org/cookiemanager;1"]
  465.                       .getService(Ci.nsICookieManager);
  466.   var allCookies = cookieManager.enumerator;
  467.   while (allCookies.hasMoreElements()) {
  468.     var cookie = allCookies.getNext()
  469.                            .QueryInterface(Ci.nsICookie);
  470.     if (cookie.host.match("blogsome.com")) {
  471.       cookieManager.remove(cookie.host, cookie.name, cookie.path, false);
  472.     }
  473.   }
  474. }
  475.  
  476. flockBSService.prototype.logout =
  477. function flockBSService_logout()
  478. {
  479.   this.logger.debug("{flockIManageableWebService}.logout()");
  480.   var cookieManager = Cc["@mozilla.org/cookiemanager;1"]
  481.                       .getService(Ci.nsICookieManager);
  482.   var allCookies = cookieManager.enumerator;
  483.   while (allCookies.hasMoreElements()) {
  484.     var cookie = allCookies.getNext()
  485.                            .QueryInterface(Ci.nsICookie);
  486.     if (cookie.host.match("blogsome.com")) {
  487.       cookieManager.remove(cookie.host, cookie.name, cookie.path, false);
  488.     }
  489.   }
  490. }
  491. // END flockIManageableWebService interface
  492.  
  493.  
  494. // ================================================
  495. // ========== BEGIN XPCOM Module support ==========
  496. // ================================================
  497.  
  498. function createModule(aParams) {
  499.   var Cc = Components.classes;
  500.   var Ci = Components.interfaces;
  501.   var Cr = Components.results;
  502.   return {
  503.     registerSelf: function (aCompMgr, aFileSpec, aLocation, aType) {
  504.       aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
  505.       aCompMgr.registerFactoryLocation( aParams.CID, aParams.componentName,
  506.                                         aParams.contractID, aFileSpec,
  507.                                         aLocation, aType );
  508.       var catMgr = Cc["@mozilla.org/categorymanager;1"]
  509.         .getService(Ci.nsICategoryManager);
  510.       if (!aParams.categories) { aParams.categories = []; }
  511.       for (var i = 0; i < aParams.categories.length; i++) {
  512.         var cat = aParams.categories[i];
  513.         catMgr.addCategoryEntry( cat.category, cat.entry,
  514.                                  cat.value, true, true );
  515.       }
  516.     },
  517.     getClassObject: function (aCompMgr, aCID, aIID) {
  518.       if (!aCID.equals(aParams.CID)) { throw Cr.NS_ERROR_NO_INTERFACE; }
  519.       if (!aIID.equals(Ci.nsIFactory)) { throw Cr.NS_ERROR_NOT_IMPLEMENTED; }
  520.       return { // Factory
  521.         createInstance: function (aOuter, aIID) {
  522.           if (aOuter != null) { throw Cr.NS_ERROR_NO_AGGREGATION; }
  523.           var comp = new aParams.componentClass();
  524.           if (aParams.implementationFunc) { aParams.implementationFunc(comp); }
  525.           return comp.QueryInterface(aIID);
  526.         }
  527.       };
  528.     },
  529.     canUnload: function (aCompMgr) { return true; }
  530.   };
  531. }
  532.  
  533. // NS Module entrypoint
  534. function NSGetModule(aCompMgr, aFileSpec) {
  535.   return createModule({
  536.     componentClass: flockBSService,
  537.     CID: BLOGSOME_CID,
  538.     contractID: BLOGSOME_CONTRACTID,
  539.     componentName: CATEGORY_COMPONENT_NAME,
  540.     implementationFunc: function (aComp) { getCompTK().addAllInterfaces(aComp); },
  541.     categories: [ // "flock-startup" is automagically added
  542.       { category: "wsm-startup", entry: CATEGORY_COMPONENT_NAME, value: BLOGSOME_CONTRACTID },
  543.       { category: "flockWebService", entry: CATEGORY_ENTRY_NAME, value: BLOGSOME_CONTRACTID }
  544.     ]
  545.   });
  546. }
  547.  
  548. // ========== END XPCOM Module support ==========
  549.  
  550.  
  551.  
  552.  
  553. /* ********** Account Class ********** */
  554.  
  555. function flockBSAccount() {
  556.   this.logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
  557.   this.logger.init("blogsomeAccount");
  558.  
  559.   this.faves_coop = Cc["@flock.com/singleton;1"]
  560.                     .getService(Ci.flockISingleton)
  561.                     .getSingleton("chrome://flock/content/common/load-faves-coop.js")
  562.                     .wrappedJSObject;
  563.  
  564.   this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  565.  
  566.   this.service = Cc[BLOGSOME_CONTRACTID].getService(Ci.flockIBlogWebService)
  567. }
  568.  
  569. // nsISupports implementation
  570. flockBSAccount.prototype.QueryInterface = function(iid) {
  571.   if (!iid.equals(Ci.nsISupports) &&
  572.     !iid.equals(Ci.flockIWebServiceAccount) &&
  573.     !iid.equals(Ci.flockIBlogWebServiceAccount))
  574.   {
  575.     throw Components.results.NS_ERROR_NO_INTERFACE;
  576.   }
  577.   return this;
  578. }
  579.  
  580. // flockIWebServiceAccount implementation
  581. flockBSAccount.prototype.login = function(listener) {
  582.   this.logger.info("{flockIWebServiceAccount}.login()");
  583.   if (listener) {
  584.     listener.onSuccess(this, "login");
  585.   }
  586. }
  587. flockBSAccount.prototype.logout = function(listener) {
  588.   this.logger.info("{flockIWebServiceAccount}.logout()");
  589.   var c_acct = this.faves_coop.get(this.urn);
  590.   if (c_acct.isAuthenticated) {
  591.     c_acct.isAuthenticated = false;
  592.     var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"]
  593.                                   .getService(Components.interfaces.nsICookieManager);
  594.     var allCookies = cookieManager.enumerator;
  595.     var cookieHost = c_acct.accountId+".blogsome.com";
  596.     while (allCookies.hasMoreElements()) {
  597.       var cookie = allCookies.getNext()
  598.                              .QueryInterface(Components.interfaces.nsICookie);
  599.       if (cookie.host == cookieHost) {
  600.         cookieManager.remove(cookieHost, cookie.name, cookie.path, false);
  601.       }
  602.     }
  603.   }
  604.   if (listener) {
  605.     listener.onSuccess(this, "logout");
  606.   }
  607. }
  608. flockBSAccount.prototype.activate = function(aListener) {
  609.   this.logger.info("{flockIWebServiceAccount}.activate()");
  610. }
  611. flockBSAccount.prototype.deactivate = function() {
  612.   this.logger.info("{flockIWebServiceAccount}.deactivate()");
  613. }
  614. flockBSAccount.prototype.keep = function() {
  615.   var c_acct = this.faves_coop.get(this.urn);
  616.   c_acct.isTransient = false;
  617.   this.acUtils.makeTempPasswordPermanent(this.service.urn+':'+c_acct.accountId);
  618. }
  619. flockBSAccount.prototype.remove = function() {
  620.   this.service.removeAccount(this.urn);
  621. }
  622.  
  623. // flockIBlogWebServiceAccount implementation
  624. flockBSAccount.prototype.getBlogs = function() {
  625.   this.logger.info("{flockIBlogWebServiceAccount}.getBlogs()");
  626.   var blogsEnum = {
  627.     QueryInterface : function(iid) {
  628.       if (!iid.equals(Ci.nsISupports) &&
  629.           !iid.equals(Ci.nsISimpleEnumerator))
  630.       {
  631.         throw Components.results.NS_ERROR_NO_INTERFACE;
  632.       }
  633.       return this;
  634.     },
  635.     hasMoreElements : function() {
  636.       return false;
  637.     },
  638.     getNext : function() {
  639.     }
  640.   };
  641.   return blogsEnum;
  642. }
  643.